package top.anhanx.alipay.pay.service;

import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import com.alipay.easysdk.kernel.util.ResponseChecker;
import com.alipay.easysdk.payment.facetoface.models.AlipayTradePayResponse;
import com.alipay.easysdk.payment.facetoface.models.AlipayTradePrecreateResponse;
import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
import org.springframework.stereotype.Service;
import top.anhanx.alipay.domain.AliPayInfo;
import top.anhanx.alipay.merchant.config.AliPayConfig;

import com.alibaba.fastjson.JSON;

import javax.annotation.Resource;

/**
 * @author FF
 */
@Service
public class AlipayService {

    @Resource
    private AliPayConfig aliPayConfig;

//    /**
//     * 支付接口
//     * @param aliPayInfo
//     * @return
//     */
//    public String pay(AliPayInfo aliPayInfo) {
//        // 1、获得初始化的AlipayClient
//        String serverUrl = aliPayConfig.getGatewayUrl();
//        String appId = aliPayConfig.getAppId();
//        String privateKey = aliPayConfig.getPrivateKey();
//        String format = "json";
//        String charset = aliPayConfig.getCharset();
//        String alipayPublicKey = aliPayConfig.getPublicKey();
//        String signType = aliPayConfig.getSignType();
//        String returnUrl = aliPayConfig.getReturnUrl();
//        String notifyUrl = aliPayConfig.getNotifyUrl();
//        AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, appId, privateKey, format, charset, alipayPublicKey, signType);
//        // 2、设置请求参数
//        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
//        // 页面跳转同步通知页面路径
//        alipayRequest.setReturnUrl(returnUrl);
//        // 服务器异步通知页面路径
//        alipayRequest.setNotifyUrl(notifyUrl);
//        // 封装参数
//        alipayRequest.setBizContent(JSON.toJSONString(aliPayInfo));
//        // 3、请求支付宝进行付款，并获取支付结果
//        String result = alipayClient.pageExecute(alipayRequest).getBody();
//        // 返回付款信息
//        return result;
//    }

    public String pay(AliPayInfo aliPayInfo) {
        Factory.setOptions(getOptions());
        try {
            // 2. 发起API调用
            AlipayTradePagePayResponse response = Factory.Payment.Page()
                    .pay(aliPayInfo.getSubject(), aliPayInfo.getOut_trade_no(), aliPayInfo.getTotal_amount(), aliPayConfig.getReturnUrl());
            // 3. 处理响应或异常
            if (ResponseChecker.success(response)) {
                System.out.println("调用成功");
                return response.getBody();
            } else {
                System.err.println("调用失败，原因：" + response.getBody());
            }
        } catch (Exception e) {
            System.err.println("调用遭遇异常，原因：" + e.getMessage());
            throw new RuntimeException(e.getMessage(), e);
        }
        return "success";
    }

    private Config getOptions() {
        Config config = new Config();
        config.protocol = "https";
        config.gatewayHost = "openapi.alipaydev.com";
        config.signType = "RSA2";

        config.appId = aliPayConfig.getAppId();

        // 为避免私钥随源码泄露，推荐从文件中读取私钥字符串而不是写入源码中
        config.merchantPrivateKey = aliPayConfig.getPrivateKey();

        //注：证书文件路径支持设置为文件系统中的路径或CLASS_PATH中的路径，优先从文件系统中加载，加载失败后会继续尝试从CLASS_PATH中加载
//        config.merchantCertPath = "<-- 请填写您的应用公钥证书文件路径，例如：/foo/appCertPublicKey_2019051064521003.crt -->";
//        config.alipayCertPath = "<-- 请填写您的支付宝公钥证书文件路径，例如：/foo/alipayCertPublicKey_RSA2.crt -->";
//        config.alipayRootCertPath = "<-- 请填写您的支付宝根证书文件路径，例如：/foo/alipayRootCert.crt -->";

        //注：如果采用非证书模式，则无需赋值上面的三个证书路径，改为赋值如下的支付宝公钥字符串即可
         config.alipayPublicKey = aliPayConfig.getPublicKey();

        //可设置异步通知接收服务地址（可选）
        config.notifyUrl = aliPayConfig.getNotifyUrl();

        //可设置AES密钥，调用AES加解密相关接口时需要（可选）
//        config.encryptKey = "<-- 请填写您的AES密钥，例如：aa4BtZ4tspm2wnXLb1ThQA== -->";

        return config;
    }

}
